# 并行计算euler14问题
# 自定义函数以返回原始数值和步数
func <- function(x) {
  n = 1
  raw <- x
  while (x > 1) {
    x <- ifelse(x%%2==0,x/2,3*x+1)
    n = n + 1
  }
  return(c(raw,n))
}


# lapply的并行版本
#library(parallel)
## 用system.time来返回计算所需时间
#system.time({
#  x <- 1:1e6
#  cl <- makeCluster(15)  # 初始化四核心集群
#  results <- parLapply(cl,x,func) # lapply的并行版本
#  res.df <- do.call('rbind',results) # 整合结果
#  stopCluster(cl) # 关闭集群
#})
## 找到最大的步数对应的数字
#res.df[which.max(res.df[,2]),1]

  
# 非并行计算方式，类似于sapply函数的功能
#library(foreach)
#system.time({
#  res.df2 <- foreach(x=1:1000,.combine='rbind') %do% func(x)
#})
#res.df2[which.max(res.df2[,2]),1]


# 启用parallel作为foreach并行计算的后端
library(doParallel)
system.time({
  cl <- makeCluster(15)
  registerDoParallel(cl)
  # 并行计算方式
  res.df3 <- foreach(x=1:1000,.combine='rbind') %dopar% func(x)
  stopCluster(cl)
})
res.df3[which.max(res.df3[,2]),1]
